package com.dxy.multids.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

@Configuration
@MapperScan({"com.dxy.multids.mapper"})
public class MybatisPlusConfig {

    /**
     * 分页插件 3.5.X
     * @author zhengkai.blog.csdn.net
     */
    @Bean
    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
        // 设置最大单页限制数量，默认 500 条，-1 不受限制
        paginationInterceptor.setMaxLimit(-1L);

        // 数据库类型，在单一类型数据库时可以设置，不设置也会自动判断
        // paginationInterceptor.setDbType(DbType.MYSQL);

        // 开启 count 的 join 优化,只针对部分 left join，默认是true
        paginationInterceptor.setOptimizeJoin(true);
        return paginationInterceptor;
    }

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 单个插件的写法
        // interceptor.addInnerInterceptor(new PaginationInnerInterceptor());

        // 不单止分页插件的写法
        interceptor.setInterceptors(Arrays.asList(paginationInnerInterceptor()));
        return interceptor;
    }

    /*
     * mybatis plus 分页插件的使用
     * IPage<UserVo> selectPageVo(IPage<?> page, Integer state);
     * // or (class MyPage extends Ipage<UserVo>{ private Integer state; })
     * MyPage selectPageVo(MyPage page);
     * // or
     * List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);
     *
     * <select id="selectPageVo" resultType="xxx.xxx.xxx.UserVo">
     *     SELECT id,name FROM user WHERE state=#{state}
     * </select>
     *
     * 如果返回类型是 ​IPage则入参的 ​IPage不能为​null​,因为 返回的​IPage ==​ 入参的​IPage​
     * 如果返回类型是 ​List则入参的 ​IPage可以为 ​null(为 ​null则不分页),但需要你手动 入参的​IPage.setRecords​(返回的 ​List​);
     * 如果 ​xml​需要从 ​page里取值,需要 ​page.属性​ 获取
     * 其他:
     * 生成 ​countSql会在 ​left join​ 的表不参与 ​where条件的情况下,把 ​left join​ 优化掉
     * 所以建议任何带有 ​left join​ 的sql,都写标准sql,即给于表一个别名,字段也要 ​别名.字段​
     *
     */
}
